﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

namespace Pacman
{
    class Fantome : TextureAnime
    {
        //Un mouvement qui va déterminer comment le fantome se comporte
        private Mouvement mvt;

        private static Vector2 FANTOME_INITIAL_POS = new Vector2(14 * 20, 14 * 20);
        private static Vector2 FANTOME_INITIAL_VIT = new Vector2(0, -20);

        private const String BASE_PIC = "images/fantome";
        private String couleur; //La couleur du fantome
        private String lettreMouv;
        private bool exit; //Permet de savoir si le Fantome est déjà sorti du bac de départ ou pas. 

        // Gestion de la sortie
        private static Vector2 SORTIEGAUCHE = new Vector2(13 * 20, 11 * 20);
        private static Vector2 SORTIEDROITE = new Vector2(14 * 20, 11 * 20);

        private Jeu jeu;


        /// 
        /// Constructeurs
        ///

        public Fantome(Jeu _jeu, String _couleur)
            : base(_jeu.getTexture2D(BASE_PIC + _couleur), FANTOME_INITIAL_POS, FANTOME_INITIAL_VIT)
        {
            this.couleur = _couleur;
            this.jeu = _jeu;
            this.mvt = null;
            initialize();

            //mvt = new MouvementDijkstra(this,jeu.Map);//Le mouvement par défaut est le mouvement Aleatoire 
            //mvt = new MouvementAleatoire(this, jeu.Map);
        }

        /// 
        /// Fonctions
        /// 

        /// <summary>
        /// Reinitialise la position et la vitesse
        /// </summary>
        public void initialize()
        {
            this.exit = true;

            this.Position = FANTOME_INITIAL_POS;
            this.Vitesse = FANTOME_INITIAL_VIT;

            //On place les fantomes au bon endroit sur la map
            if (this.couleur == "Rose")
                this.Position = new Vector2((12 * 20), this.Position.X);
            if (this.couleur == "Bleu")
                this.Position = new Vector2((13 * 20), this.Position.X);
            if (this.couleur == "Vert")
                this.Position = new Vector2((15 * 20), this.Position.X);

        }//initialize()

        public void reInitialize()
        {
            this.initialize();
            this.fantomeRecolorer(); // couleur et ancienMouvement()
        }//initialize()
        
        public void fantomePeur()
        {
            this.Texture = jeu.getTexture2D("images/FantomePeur0");
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="mesSommets"></param>
        /// <param name="pacman"></param>
        /// <returns> 1 si Pacman rencontré, 0 sinon</returns>
        public int BougerFantome(Sommet[,] mesSommets, Pacman pacman)
        {
            //On vérifie d'abord si le fantome est sur le pacman. Cela est une éventualité car le pacman bouge avant les fantomes.
            if (Mvt.PixToMap(this.Position) == Mvt.PixToMap(pacman.Position))
                return 1;

            if(mvt != null)
                mvt.Avance(jeu, mesSommets, pacman, this); //On lance le comportement du fantome

            // Sortie de exit
            if (this.exit && (((this.couleur == "Rose" || this.couleur == "Bleu") && this.Position == SORTIEGAUCHE) || ((this.couleur == "Rouge" || this.couleur == "Vert") && this.Position == SORTIEDROITE))) 
            {
                this.exit = false;
            }
            
            // Deuxieme verification si le fantome mange le pacman
            if (Mvt.PixToMap(this.Position) == Mvt.PixToMap(pacman.Position))
                return 1;
            else
                return 0;
        }

        public void setMouv(String m)
        {
            int divid; //La vitesse du mouvement actuel

            if (this.mvt != null)
                divid = this.mvt.IndDividVitesse;
            else
                divid = 0;

            if (m == "A")
            {
                this.mvt = new MouvementAleatoire(this, jeu.Map, divid);
                this.lettreMouv = "A";
            }
            else if (m == "D")
            {
                this.mvt = new MouvementDijkstra(this, jeu.Map, divid);
                this.lettreMouv = "D";
            }
            else if (m == "F")
                this.mvt = new MouvementFuite(this, jeu.Map, divid);
        }

        //Recolore le Fantome (sortie de fantome peur/fuite)
        public void fantomeRecolorer()
        {
            this.Texture = jeu.getTexture2D(BASE_PIC + couleur);
            this.AncienMouvement();
           
        }

        //Rend son comportement au Fantome
        public void AncienMouvement()
        {
            if (this.mvt != null)
            {
                if (this.LettreMouv == "D")
                    this.setMouv("D");
                else if (this.lettreMouv == "A")
                    this.setMouv("A");
            }
        }

        /// 
        /// Getters / Setters
        /// 

        public Mouvement Mvt
        {
            get { return mvt; }
            set { mvt = value; }
        }

        public String Couleur
        {
            get { return couleur; }
            set { couleur = value; }
        }


        public static Vector2 SORTIEDROITE_G
        {
            get { return Fantome.SORTIEDROITE; }
            set { Fantome.SORTIEDROITE = value; }
        }

        public bool Exit
        {
            get { return exit; }
            set { exit = value; }
        }

        public static Vector2 SORTIEGAUCHE_G
        {
            get { return Fantome.SORTIEGAUCHE; }
            set { Fantome.SORTIEGAUCHE = value; }
        }

        public String LettreMouv
        {
            get { return lettreMouv; }
            set { lettreMouv = value; }
        }

        public String LettreMouv1
        {
            get { return lettreMouv; }
            set { lettreMouv = value; }
        }
    }
}
